"""
Голосование за исключение участника из чата.

1. Если не указывать кого изгнать, показывается список заявок на изгнание.
2. Если указать пользователя, и его не было в списке заявок, создаётся новая.
3. Срок жизни заявки зависит от количетва участников в беседе.
3. Если указать пользователя и его заявка есть - вы голосуете за его изгнание.
4. Eсли проголосовало больше 50% - участник исключается/

Author: Milinuri Nirvalen
"""

from chiori import Plugin
from libs.chat_control import get_chat
from libs.chat_control import get_str_time
from libs.chat_control import kick
from libs.vk import args
from libs.vk import get_ids


p = Plugin(name='чат: голосование за исключение', backend='vk',
	desc='голосование за исключение участника из чата.',
	args= {'target':args['target']})


# handers
# =======

@p.eventHandler('before')
async def _(event, ctx):
	c = get_chat(event)

	if not 'voteban' in c.file_data:
		c.file_data['voteban'] = {}

	if c.file_data['voteban']:

		profiles = event.get('to.profiles')
		text = ''
		for k, v in list(c.file_data["voteban"].items()):
			if k not in profiles:
				del c.file_data["voteban"][k]
				continue

			pr = profiles[k]
			if v["end_time"] <= ctx.now:
				del c.file_data["voteban"][k]

				percent = round(len(v["votes"])/len(profiles)*100, 2)
				text += f'''\nголосование за исключение {pr["name"]} завершено.
	-- набрано {len(v["votes"])}/{len(profiles)} голосов ({percent}%)'''

				if percent >= 50:
					if pr.get('is_admin'):
						text += f'\n-- вы попытались иключить администратора'
						continue

					c.file_data['banned'][k] = 0
					await kick(event, ctx, k)
					text += f'\n-- участник будет изгнан'

				else:
					text += f'\n-- недостаточно для изгнания участника'

				text += f'\n'

		if text:
			c.save()
			await ctx.message(text)


# commands
# ========

@p.command('изгнать', usage='[target] создать заявку на изгнание пользхователя',
	check_func={'check_chat':0}, else_func='chioNotAdmin')
async def voteban(event, ctx):
	targets = await get_ids(event, ctx)
	profiles = event.get('to.profiles')
	uid = str(event.get('from.id'))

	if targets:
		text = 'изгание участника:'
		c = get_chat(event)

		if not 'voteban' in c.file_data:
			c.file_data["voteban"] = {}

		for x in targets:
			if x not in profiles:
				text += f'\n-- [{x}] нету в чате'
				continue

			pr = profiles[x]

			if x in c.file_data['holy_members']:
				text += f'\n-- {pr["name"]} святой(ая)'
				continue

			if x in c.file_data["voteban"]:
				if uid not in c.file_data["voteban"][x]["votes"]:
					c.file_data["voteban"][x]["votes"].append(uid)
					votes = len(c.file_data["voteban"][x]["votes"])

					text += f'\n-- вы добавили голос за изгнание {pr["name"]} ({votes})'

				else:
					text += f'\n-- нельзя голосовать дважды за изгнание одного участника'

			else:
				c.file_data["voteban"][x] = {'votes':[uid],
					'end_time':ctx.now + (60*len(profiles)*3)}
				text += f'\n-- создано голосование на изгнание {pr["name"]} ({len(profiles)*3} мин.)'

		c.save()

	else:
		c = get_chat(event).file_data.get('voteban', {})
		text = f'действующие голосования: {len(c)}'

		for k, v in c.items():
			pr = profiles[k]

			percent = round(len(v["votes"])/len(profiles)*100, 2)

			t = get_str_time(v['end_time'] - ctx.now)
			text += f'\n-- [{t}] {pr["name"]}: {len(v["votes"])}/{len(profiles)} ({percent}%)'


	await ctx.message(text)
